/**
 * layer统一处理
 * @param result 返回的结果
 */
function layerShow(result) {
    layui.use('layer', function () {
        let layer = layui.layer;
        if (result.success) {
            layer.msg(result.msg, {icon: 1});
        } else {
            layer.msg(result.msg, {icon: 2});
        }
    });

}


/**
 * 设置日期选择器
 * @param $select
 */
function setDateSelector($select) {
    $select.daterangepicker({
        locale: {
            "format": 'YYYY-MM-DD HH:mm:ss',
            "separator": " - ",
            "applyLabel": "确定",
            "cancelLabel": "取消",
            "resetLabel": "重置",
            "fromLabel": "起始时间",
            "toLabel": "结束时间'",
            "customRangeLabel": "自定义",
            "weekLabel": "W",
            "daysOfWeek": ["日", "一", "二", "三", "四", "五", "六"],
            "monthNames": ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
            "firstDay": 1
        },
        ranges: {
            '今日': [moment(), moment()],
            '昨日': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
            '最近7日': [moment().subtract(6, 'days'), moment()],
            '最近30日': [moment().subtract(29, 'days'), moment()],
            '本月': [moment().startOf('month'), moment().endOf('month')],
            '上月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
            '今年': [moment().startOf('year'), moment().endOf('year')],
        },
        "alwaysShowCalendars": true,
        "startDate": moment().subtract(1, 'month'),  //1年前
        "endDate": new Date(),
        "opens": "right",
    }, function (start, end, label) {
    });
}


/**
 * 模糊搜索 输入信息 ，返回符合条件的列表
 * @param $name
 * @param $ul
 * @param data
 */
function writeUlOnChange($id, $name, $ul, data) {
    $ul.html('<ul></ul>');
    data.forEach(function (item) {
        // 创建<a>元素
        let $a = $('<a>', {
            id: item.id,
            href: 'javascript:;',
            text: item.name,
            click: function (event) {
                chooseLi($id, $name, $ul, item);
            }
        });
        // 创建<li>元素并将<a>元素添加进去
        let $li = $('<li>').append($a);

        $ul.append($li);
    })
    $ul.show();
}

/**
 * 选择 符合条件的下拉框中的 选项后，
 * 填充数据
 * @param $name
 * @param $ul
 * @param item
 */
function chooseLi($id, $name, $ul, item) {

    $name.focus();
    $name.val(item.name);
    $id.val(item.id);// 为input设置值
    $id.text(item.id);// 为td设置值
    $ul.find("li").remove();
    $ul.hide();

    // 获取入库成本
    let $costYuan = $name.closest("tr").find("[name = 'costYuan']");
    if ($costYuan != null) {
        $costYuan.text(item.costYuan);
    }
}


/**
 * 动态为下拉框添加数据
 * @param $select
 * @param data
 */
function writeDropDownData($select, data) {
    $.each(data, function (index, item) {
        // 假设item有一个id和一个name属性
        let option = $("<option>").val(item.id).text(item.name);
        $select.append(option);
    });
    $select.selectpicker('refresh');
    $select.selectpicker('render'); // 在某些情况下可能还需要调用render方法
}


/**
 * 为表格新增一行
 * @param $table
 */
function addOneTr($table) {
    // 获取表头
    let $header = $table.find('thead th');
    // 创建新行，并设置行高
    let $tr = $("<tr></tr>");
    $tr.css("height", $header.outerHeight())

    $header.each(function (index, element) {
        // 根据表头，获取与对应head 的 name属性
        let filedName = $(element).attr("name");
        // 新的元素格,并添加点击事件，点击变成输入框
        let $td = $("<td>", {
            click: function () {
                textToInput($table, filedName, {}, $(this));
            }
        });
        $td.attr("name", filedName);
        // 所有格子样式设置
        $td.css("text-align", "center");
        $td.attr("class", $(element).attr("class"));

        // 特殊填充列
        switch (filedName) {
            case 'productId':
                let id = $("#addProductId").val();
                $td.append("<span>" + id + "</span>");
                break;
            case 'productName':
                let name = $("#addProductName").val();
                $td.append("<span>" + name + "</span>");
                break;
            case 'shopId':
                let shopId = $("#addShop").val();
                $td.append("<span>" + shopId + "</span>");
                break;
            case 'shopName':
                let shopName = $("#addShop option:selected").text();
                $td.append("<span>" + shopName + "</span>");
                break;
            case 'supplierId':
                let supplierId = $("#addSupplier").val();
                $td.append("<span>" + supplierId + "</span>");
                break;
            case 'supplierName':
                let supplierName = $("#addSupplier option:selected").text();
                $td.append("<span>" + supplierName + "</span>");
                break;
            case 'repositoryId':
                let repositoryId = $("#addRepository").val();
                $td.append("<span>" + repositoryId + "</span>");
                break;
            case 'repositoryName':
                let repositoryName = $("#addRepository option:selected").text();
                $td.append("<span>" + repositoryName + "</span>");
                break;
            case 'note':
                let note = $("#addNote").val();
                $td.append("<span>" + note + "</span>");
                break;
            case 'operate':
                let $deleteBtn = $("<button>", {
                    type: 'button',
                    class: 'btn btn-xs btn-link',
                    text: "删除",
                    click: function () {
                        $(this).closest('tr').remove();
                    }
                });
                $td.append($deleteBtn);
                break;

        }

        // 创建新的<$tr>元素并设置文本内容
        $tr.append($td); // 将新的<td>元素添加到<$tr>中
    })
    // 将新创建的<$tr>元素追加到tbody的末尾
    $table.find('tbody').append($tr);
}

/**
 * 点击后变成输入框，丢失焦点变回文本
 * @param $table 所在表格
 * @param fieldName 字段名
 * @param row bootstrap中的当前行数据（非bootstrap可以不管）
 * @param $td 变成输入框的元素
 */
function textToInput($table, fieldName, row, $td) {
    // 操作列不做改变
    if ($td.is("button") || $td.find("button").length > 0) {
        return;
    }
    // 检查当前td是否已转换为input，避免重复转换
    if ($td.find("input").length !== 0) {
        return;
    }
    // 获取td的原始文本内容
    let originalText = $td.text();

    let $ul = '';
    // 看情况添加下拉搜索框
    if (fieldName.includes("Name") || fieldName.includes("name")) {
        $ul = $("<ul>", {
            "class": "dropdown-menu pre-scrollable top-ul"
        });
    }

    // 创建一个input元素，并设置其值为td的原始文本
    let $input = $("<input>", {
        type: "text",
        value: originalText
    }).addClass(fieldName);

    // 模糊搜索并动态填充下拉列表数据，（商品，供应商，仓库）
    $input.on("input", function () {
        let $id;
        switch (fieldName) {
            case "productName":
                $id = writeIdByName($td, "productId");
                writeProductUl($id, $input, $ul);
                break;
            case "supplierName":
                $id = writeIdByName($td, "supplierId");
                writeSupplierUl($id, $input, $ul);
                break;
            case "shopName":
                $id = writeIdByName($td, "shopId");
                writeShopUl($id, $input, $ul);
                break;
            case "repositoryName":
                $id = writeIdByName($td, "repositoryId");
                writeRepositoryUl($id, $input, $ul);
                break;
        }


        function writeIdByName($td, idFileName) {
            let $id = $td.parent().find("[name=" + idFileName + "]");
            // 当前行所有td
            if ($id.length === 0) {
                let $tds = $td.parent().children();
                $id = $($tds[getTdIndexByFiled($table, idFileName)]);
            }
            return $id;
        }
    });
    // 当input失去焦点时触发
    $input.on("blur", function (event) {
        // 获取即将获得焦点的元素
        let target = event.relatedTarget || event.originalEvent.explicitOriginalTarget;
        // 点击的不是$ul
        if (!$(target).closest('ul').length) {
            let newText = $(this).val(); // 获取用户输入的新文本
            // 将input替换回文本
            $(this).replaceWith("<span>" + newText + "</span>");
            // 更改该字段的row数据
            row[fieldName] = newText;
            // 更改其他关联的数据
            updateLinkData($table, fieldName, row, $td);
            // 内容修改时，修改字体颜色
            if (originalText !== newText) {
                $td.css("color", "red");
            }
            // 失去焦点时，如果有$ul,则隐藏$ul
            if ($ul.length > 0) {
                $ul.find("li").remove();
                $ul.hide();
            }
        }
    });
    // ul 添加到 td 中
    $td.html("").append($input).append($ul);
    // 立即聚焦到新创建的input元素上
    $input.focus();

    /**
     * 修改某一个字段时，同步修改相关的其他字段数据
     * @param $table
     * @param field
     * @param row
     * @param $element
     */
    function updateLinkData($table, field, row, $element) {
        let id = $table.attr("id");
        let obj = window[id];
        if (typeof obj.syncData === 'function') {
            obj.syncData($table, field, row, $element);
        }
    }

}


/**
 * bootstrap中根据当前行字段名，获取已显示的tds中的索引
 * @param $table
 * @param field
 * @returns {number}
 */
function getTdIndexByFiled($table, field) {
    // 所有字段集合中的索引
    let index = 0;
    // 遍历过的隐藏字段数量
    let hiddenColumnNum = 0;
    let columns = $table.bootstrapTable('getOptions').columns[0];
    // 遍历bootstrap的字段
    for (index = 0; index < columns.length; index++) {
        let column = columns[index]

        // 是隐藏列，隐藏字段数量+1
        if (column != null && !column.visible) {
            hiddenColumnNum++;
        }
        // 找到了该字段,且该字段隐藏
        if (field == column.field && !column.visible) {
            return -1;
        }
        // 找到了该字段,且该字段不隐藏
        if (field == column.field && column.visible) {
            break;
        }
    }
    // 不隐藏的tds中的索引
    return index - hiddenColumnNum;

}

/**
 * 获得某个表格的数据
 * @param $table
 * @returns {*[]}
 */
function getTableData($table) {
    let tableData = [];
    $table.find("tbody tr").each(function () {
        // 获取当前<td>的文本内容并添加到数组中
        let trData = getTrData($(this));
        tableData.push(trData);
    });
    return tableData;
}

/**
 * 获得某一行的数据
 * @param $tr
 * @returns {*[]}
 */
function getTrData($tr) {
    let rowData = {};
    $tr.find("td").each(function () {
        // 获取当前<td>的文本内容并添加到数组中
        rowData[$(this).attr("name")] = $(this).text().trim();
    })
    return rowData;
}









